package com.cryptoneedle.garden.init;


import com.cryptoneedle.garden.entity.garden.config.ConfigProperty;
import com.cryptoneedle.garden.enums.ConfigPropertyEnum;
import com.cryptoneedle.garden.enums.ConfigPropertyTypeEnum;
import com.cryptoneedle.garden.service.garden.config.ConfigPropertyService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.Strings;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * <p>description: 配置属性-初始化 </p>
 *
 * @author CryptoNeedle
 * @date 2025-09-25
 */
@Component
@Slf4j
public class ConfigPropertyInitializer implements CommandLineRunner {

    @Resource
    private ConfigPropertyService configPropertyService;

    @Override
    public void run(String... args) throws Exception {
        log.info("开始初始化Doris配置项...");
        initialize();
        log.info("Doris配置项初始化完成");
    }

    private void initialize() {
        for (ConfigPropertyEnum configPropertyEnum : ConfigPropertyEnum.values()) {
            String name = configPropertyEnum.getName();
            ConfigProperty configProperty = configPropertyService.getById(name);
            if (configProperty == null) {
                // 初始化配置
                configProperty = new ConfigProperty()
                        .setName(configPropertyEnum.getName())
                        .setComment(configPropertyEnum.getComment())
                        .setValue(configPropertyEnum.getDefaultValue())
                        .setType(ConfigPropertyTypeEnum.AUTO);
                log.info("初始化配置 {} ({}) -> value: {}", configProperty.getName(), configProperty.getComment(), configProperty.getValue());
            } else {
                // 更新自动配置项
                if (ConfigPropertyTypeEnum.AUTO.equals(configProperty.getType())) {
                    configProperty = new ConfigProperty()
                            .setName(configPropertyEnum.getName())
                            .setComment(configPropertyEnum.getComment())
                            .setValue(configPropertyEnum.getDefaultValue())
                            .setType(ConfigPropertyTypeEnum.AUTO);
                    log.info("重置配置 {} ({}) -> comment: {}", configProperty.getName(), configProperty.getComment(), configProperty.getValue());
                } else if (ConfigPropertyTypeEnum.MANUAL.equals(configProperty.getType())) {
                    // 手动配置项
                    if (!Strings.CS.equals(configProperty.getComment(),  configPropertyEnum.getComment())) {
                        configProperty.setComment(configPropertyEnum.getComment());
                        log.info("手动配置 {} ({}) -> comment: {}", configProperty.getName(), configProperty.getComment(), configProperty.getValue());
                    }
                }
            }

            configPropertyService.save(configProperty);
        }
    }
}